#include "gameboard.h"
#include <QGridLayout>
#include <QPushButton>
#include <QVBoxLayout>
#include "digital_process.h"
#include <QMouseEvent>
#include <vector>
using std::vector;

int init_arr_random(int *arr,int len)
{
    int flag = 0,num=0;
    Digital_process Digital;
    while(1){
        if(flag == 2){
            break;
        }
        num = Digital.get_random_number(0,len-1);
        if(arr[num] == 1){

        }else{
            arr[num] = 1;
            flag ++;
        }
    }
    return 0;
}

int init_arr_random_1(int *arr,int len)
{
    int num=0;
    Digital_process Digital;
    num = Digital.get_random_number(0,len-1);
    arr[num] = 1;
    return num;
}
//2:4  7:3
int get_2_or_4()
{
    int num=0;
    Digital_process Digital;
    num = Digital.get_random_number(0,9);
    if(num<8){
        return 2;
    }else{
        return 4;
    }
}

void hand_my_arr_move(int arr[])
{
    for(int i=0;i<4;i++)
    {
        if(arr[i] == 0 && arr[i+1] != 0){
            arr[i] = arr[i+1];
            arr[i+1]=0;
        }
    }
}

int hand_my_arr_he(int arr[])
{
    if(arr[0] == 0){
        return 0;
    }

    for(int i=0;i<4;i++)
    {
        if(arr[i] != 0 && arr[i] == arr[i+1]){
            arr[i] *= 2;
            arr[i+1] = 0;
            hand_my_arr_move(arr);
        }
    }
    return 0;
}

void move_my_arr(int arr[])
{
    hand_my_arr_move(arr);
    hand_my_arr_move(arr);
    hand_my_arr_move(arr);
}

void move_and_he_arr(int arr[])
{
    move_my_arr(arr);
    hand_my_arr_he(arr);
}

int GameBoard::set_tile_value_0_num(int num)
{
    tile_value_0_num = num;
    return 0;
}
int GameBoard::get_tile_value_0_num()
{
    return tile_value_0_num;
}

GameBoard::GameBoard(QWidget *parent) : QWidget(parent) {

    // 创建一个垂直布局
    //QVBoxLayout *mainLayout = new QVBoxLayout(this);
    //QPushButton *button = new QPushButton("Top Button");
    //mainLayout->addWidget(button); // 这将把按钮放在布局的顶部
    int arr[16]={0};

    init_arr_random(arr,16);
    QGridLayout *layout = new QGridLayout(this);

    // 初始化Tile对象并设置值为2
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            //初始化随机值
            if(arr[i*4+j]==1){
                tiles[i][j] = new Tile(get_2_or_4(), this, QColor(Qt::yellow));
            }else{
                tiles[i][j] = new Tile(0, this, QColor(Qt::yellow));
            }

            layout->addWidget(tiles[i][j], i, j);
        }
    }
    set_tile_value_0_num(2);
    // 设置GameBoard的布局
    setLayout(layout);
}
void GameBoard::mousePressEvent(QMouseEvent *event)
{
    pressPos = event->pos(); // 存储鼠标按下时的位置
    lastPos = pressPos;      // 初始化lastPos
    isMousePressed = true;    // 标记鼠标已按下
}

void GameBoard::mouseMoveEvent(QMouseEvent *event)
{
    if (isMousePressed) {
        lastPos = event->pos(); // 更新lastPos
        // 这里可以根据需要添加额外的逻辑来更新moveDirection（如果需要的话）
    }
}

int GameBoard::get_tiles_value(int i ,int j)
{
    return tiles[i][j]->get_value();
}



int left_value(int *arr)
{
    move_and_he_arr(arr);
    return 0;
}
int right_value(int *arr)
{
    int arr_tmp[5]={0};
    int i,j;
    for(i=3,j=0;i>=0;i--,j++){
        arr_tmp[j] = arr[i];
    }
    move_and_he_arr(arr_tmp);
    for(i=3,j=0;i>=0;i--,j++){
        arr[j] = arr_tmp[i];
    }
    return 0;
}

void printf_arr(int (*array)[5])
{
    int i;
    for(i=0;i<4;i++){
        qDebug() << "printf_arr "<<array[i][0]<<" "<<array[i][1]<<" "<<array[i][2]<<" "<<array[i][3];
    }
}

void down_value(int (*array)[5])
{
    int arr_tmp[4][5]={0};
    int i,j,k;
    for(i = 0;i < 4;i++){
        for(j=0,k=3;j<4;j++,k--){
            arr_tmp[i][j] = array[k][i];
        }
    }

    for(i=0;i<4;i++)
    {
        left_value(arr_tmp[i]);
    }

    for(i = 0;i < 4;i++){
        for(j=0,k=3;j<4;j++,k--){
            array[k][i] = arr_tmp[i][j];
        }
    }
}

void up_value(int (*array)[5])
{
    int arr_tmp[4][5]={0};
    int i,j,k;

    for(i = 0;i < 4;i++){
        for(j=0,k=3;j<4;j++,k--){
            arr_tmp[i][j] = array[j][i];
        }
    }

    for(i=0;i<4;i++)
    {
        left_value(arr_tmp[i]);
    }

    for(i = 0;i < 4;i++){
        for(j=0,k=3;j<4;j++,k--){
            array[j][i] = arr_tmp[i][j];
        }
    }
}

int he_bing_xiangtong(int (*array)[5],Qt::ArrowType direction)
{
    int i=0,j=0;

    if(direction == Qt::LeftArrow)
    {
        for(i=0;i<4;i++)
        {
            left_value(array[i]);
        }
    }
    else if(direction == Qt::RightArrow)
    {
        for(i=0;i<4;i++)
        {
            right_value(array[i]);
        }
    }
    else if(direction == Qt::DownArrow)
    {
        down_value(array);
    }
    else if(direction == Qt::UpArrow)
    {
        up_value(array);
    }
    return 0;
}

void printf_arr_1(int (*array),int len)
{
    int i;
    qDebug()<<"---------------------";
    for(i=0;i<len;i++){
        qDebug()<<" "<<array[i];
    }
    qDebug()<<"---------------------";
}
void create_2_or_4(int (*array)[5],int *arr,int num,int *arr_index)
{
    int ii = init_arr_random_1(arr,num);
    //qDebug() << "ii="<<ii<<"num="<<num;
    //printf_arr(array);
    int i,j,flag=0;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(array[i][j]==0){
                if(arr[flag++]==1){
                    arr_index[0]=i;
                    arr_index[1]=j;

                    arr_index[2] = get_2_or_4();
                    //qDebug() << "i="<<i<<"j="<<j<<"arr_index[2]="<<arr_index[2];
                    array[i][j] = arr_index[2];
                    break;
                }
            }
        }
    }
}

int my_compare(int (*array_tmp)[5],int (*array)[5])
{
    int i,j;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(array_tmp[i][j]!=array[i][j]){
                return 1;
            }
        }
    }
    return 0;
}

//返回值，0为死路，1为活路
int  is_Living_Path(int (*array)[5])
{
    //只需要判断往右比较或者往下比较就行
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            if(array[i][j] == 0 || array[i][j+1]==0 || array[i+1][j]==0){
                //std::cout<<"yes"<<std::endl;
                return 1;
            }
            if(array[i][j] == array[i][j+1] || array[i][j] == array[i+1][j]){
                //std::cout<<"yes"<<std::endl;
                return 1;
            }
        }
    }
    //std::cout<<"no"<<std::endl;
    return 0;
}
void GameBoard:: mouseReleaseEvent(QMouseEvent *event)
{
    int num_0=get_tile_value_0_num();
    //重新构键数组防止越界创建array[4][5]
    int array[4][5]={0},array_tmp[4][5]={0};
    int i=0,j=0;
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            array[i][j]=get_tiles_value(i,j);
            array_tmp[i][j] = array[i][j];
        }
    }
    if(num_0==0 && is_Living_Path(array)==0){
        qDebug() << "你已经G了";
        return ;
    }
    if (isMousePressed) {
        QPoint diff = event->pos() - pressPos; // 计算总的移动方向和距离

        if (qAbs(diff.x()) > qAbs(diff.y())) {
            // 主要是水平移动
            if (diff.x() > 0) {
                moveDirection = Qt::RightArrow;
                //qDebug() << "RightArrow";
            } else {
                moveDirection = Qt::LeftArrow;
                //qDebug() << "LeftArrow";
            }
        } else {
            // 主要是垂直移动
            if (diff.y() > 0) {
                moveDirection = Qt::DownArrow;
                //qDebug() << "DownArrow";
            } else {
                moveDirection = Qt::UpArrow;
                //qDebug() << "UpArrow";
            }
        }

        // 在这里可以使用moveDirection进行后续操作
        qDebug() << "Mouse moved in direction:" << moveDirection;
        for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                array[i][j]=get_tiles_value(i,j);
                array_tmp[i][j] = array[i][j];
            }
        }

        he_bing_xiangtong(array,moveDirection);

        if(my_compare(array_tmp,array)==0){
            qDebug() << "换个方向";
            return ;
        }
        //移动后的数组设置到tiles中
        num_0=0;
        for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                if(array[i][j]==0){
                    num_0++;
                }
                //tiles[i][j]->setValue(array[i][j]);
            }
        }
        set_tile_value_0_num(num_0);

        //在0值中随机给一个2或者4
        int arr[16]={0},arr_index[3]={0};
        int num = get_tile_value_0_num();
        //printf_arr(array);
        create_2_or_4(array,arr,num,arr_index);
        //qDebug() << "i="<<arr_index[0]<<" j="<<arr_index[1]<<" value="<<arr_index[2];
        //tiles[arr_index[0]][arr_index[1]]->setValue(arr_index[2]);
        //printf_arr(array);
        num_0 = 0;
        for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                if(array[i][j]==0){
                    num_0++;
                }
                tiles[i][j]->setValue(array[i][j]);
            }
        }
        set_tile_value_0_num(num_0);
        if(num_0==0 && is_Living_Path(array)==0){
           qDebug() << "你已经G了";
        }
        // 重置状态
        pressPos = QPoint(-1, -1);
        lastPos = QPoint(-1, -1);
        moveDirection = Qt::NoArrow;
        isMousePressed = false;
    }
}
